home *** CD-ROM | disk | FTP | other *** search
- TITLE CAPSTATE - Display state of CapsLock and NumLock keys
- PAGE 63,132
- ;
- ; Progam CAPSTATE.ASM (CAPSTATE.COM)
- ;
- ; Author: Larry Bradley
- ; Ottawa, Canada
- ; February 5, 1984
- ;
- ; This program is a version of KEYFLAGS by Morton Kaplan
- ; (see PC World Vol. 1 No. 7, Oct. 1983 pp 266-271)
- ; This version does not use BIOS calls to display the state
- ; of the CapsLock and NumLock keys, but writes directly
- ; to the display buffer (for mono or color). This solves
- ; the problem of incompatibility with SCROLLK rpogram.
- ;
- ; This program displays an up arrow for caps lock and a
- ; number sign for numlock, intensified, in row 0, cols 78 & 79.
- ; The variable STATE_POSN gives the display buffer address where
- ; the display is to start, thus it may easily be changed.
- ;
- ; After assembling and linking this module, use EXE2BIN
- ; to create a COM module. This version only works with
- ; DOS 2.0, since DOS function 35 is used to get the old
- ; interrupt vector. It could be changed to get the vector
- ; directly.
- ;
- DATA SEGMENT AT 40H ;BIOS DATA AREAS
- ORG 10H
- EQUIP_FLAG DW ? ;TO CHECK IF MONO/COLOR DISPLAY
- ORG 17H
- KB_FLAG DB ?
- CAPS_STATE EQU 40H
- NUM_STATE EQU 20H
- DATA ENDS
- ;
- CODE SEGMENT
- ASSUME CS:CODE,DS:DATA
- ORG 100H
- START: JMP INIT
- ;
- OLD_KB_INT DD ? ;SAVE OLD KEYBOARD INTERRUPT VECTOR
- STATE_POSN EQU 156 ;ROW 0 COL 78 (REGEN ADDRESS)
- ;
- KB_INT PROC FAR
- STI
- PUSHF
- CALL OLD_KB_INT ;INVOKE ROM ROUTINE TO READ KEYBOARD
- PUSH DS
- PUSH ES
- PUSH AX
- PUSH BX
- PUSH DI
- MOV AX,40H
- MOV DS,AX ;DS -> ROM BIOS DATA
- MOV AX,0B800H ;ASSUME COLOR DISPLAY
- MOV BX,EQUIP_FLAG
- AND BX,30H
- CMP BX,30H ;IS IT?
- JNE COLOR ;YES
- MOV AX,0B000H ;NO, MONOCHROME
- COLOR: MOV ES,AX ;SET REGEN ADDRESS
- MOV DI,STATE_POSN ;WHERE TO PUT THE INDICATORS ON THE SCREEN
- MOV AX,0720H ;ASSUME NO CAPS:NORMAL ATTR+BLANK
- TEST KB_FLAG,CAPS_STATE ;IS IT?
- JE NOCAPS ;NOT CAPS, JUMP
- MOV AX,0F18H ;CAPS:BRIGHT ATTR+UP ARROW
- NOCAPS: STOSW ;WRITE IT TO DISPLAY BUFFER
- MOV AX,0720H ;ASSUME NOT NUMLOCK: NORMAL ATTR+BLANK
- TEST KB_FLAG,NUM_STATE ;IS IT?
- JE NONUM ;NOT NUMLOCK, JUMP
- MOV AX,0F23H ;NUMLOCK:BRIGHT PLUS # SIGN
- NONUM: STOSW ;WRITE IT TO DISPLAY
- POP DI
- POP BX
- POP AX
- POP ES
- POP DS
- IRET
- KB_INT ENDP
- ;
- ; INITIALIZATION CODE.
- ; SAVE OLD INTERRUPT 9 VECTOR, SET NEW ONE.
- ;
- ASSUME CS:CODE,DS:CODE
- INIT: MOV AL,9 ;GET INTERRUPT VECTOR
- MOV AH,35H ;FOR INTTERRUPT 9
- INT 21H ;THE KEYBOARD INTERRUPT
- MOV OLD_KB_INT+2,ES ;SAVE OLD CS
- MOV OLD_KB_INT,BX ;SAVE OLD IP
- MOV DX,OFFSET KB_INT ;NEW IP FOR INTERRUPT
- MOV AL,9 ;SET NEW INTERRUPT VECTOR
- MOV AH,25H ;FOR INTERRUPT 9
- INT 21H
- MOV DX,OFFSET INIT ;LAST BYTE IN INTERRUPT ROUTINE
- INT 27H ;TERMINATE, STAY RESIDENT
- CODE ENDS
- END START
-
- *** CREATED 02/06/84 19:47:32 BY NRC ***
-